home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 722 / 722.xpi / chrome / noscript.jar / content / noscript / PlacesPrefs.js < prev    next >
Text File  |  2010-02-12  |  8KB  |  249 lines

  1. var PlacesPrefs = {
  2.   
  3.   QueryInterface: xpcom_generateQI([CI.nsINavBookmarkObserver, CI.nsISupportsWeakReference, CI.nsISupports]),
  4.   bmsvc: CC["@mozilla.org/browser/nav-bookmarks-service;1"].getService(CI.nsINavBookmarksService),
  5.   annsvc: CC["@mozilla.org/browser/annotation-service;1"].getService(CI.nsIAnnotationService),
  6.  
  7.   LEGACY_NAME: "* NoScript Configuration",
  8.   NAME: "[NoScript]",
  9.   PROP: "bookmarkProperties/description",
  10.   
  11.   dump: function(msg) {
  12.     if (ns.consoleDump) ns.dump("Bookmark-Sync - " + msg);
  13.   },
  14.   
  15.   get uri() {
  16.     delete this.uri;
  17.     var tpl = '<h1>%title%</h1><p>%message%</p>';
  18.     for each(var l in ["title", "message"]) {
  19.       tpl = tpl.replace('%' + l + '%', ns.getString("bookmarkSync." + l).replace(/</g, '<').replace(/>/g, '>'));
  20.     }
  21.     return this.uri = IOS.newURI(
  22.       'data:text/html;charset=UTF-8,' + encodeURIComponent(tpl.replace(/\b(Weave)\b/, '<a href="http://labs.mozilla.com/projects/weave/">$1</a>')
  23.       .replace(/\b(XMarks(\s+extension)?)\b/i, '<a href="https://addons.mozilla.org/en-US/firefox/addon/2410">$1</a>'))
  24.     , null, null);
  25.   },
  26.   
  27.   init: function() {
  28.     this.wrappedJSObject = this;
  29.     this.bmsvc.addObserver(this, false);
  30.   },
  31.   
  32.   dispose: function(ns) {
  33.     this.bmsvc.removeObserver(this, false);
  34.   },
  35.   
  36.   onItemAdded: function(aItemId, aFolder, aIndex) {
  37.     this.sync(aItemId, aFolder, '');
  38.   },
  39.   onItemChanged: function(aBookmarkId, aProperty, aIsAnnotationProperty, aValue) {
  40.     if (aProperty == "uri" || aIsAnnotationProperty && aProperty == this.PROP)
  41.       this.sync(aBookmarkId, null, aValue);
  42.   },
  43.   onItemRemoved: function(id, folderId, index) {
  44.     if (id == this._lastId || id == this._lastFolderId) {
  45.       this._lastId = this._lastFolderId = -1;
  46.     }
  47.   },
  48.   onBeginUpdateBatch: function() {},  
  49.   onEndUpdateBatch: function() {},
  50.   onItemVisited: function() {},
  51.   onItemMoved: function() {},
  52.   onBeforeItemRemoved: function() {},
  53.   
  54.   _lastId: -1,
  55.   _lastFolderId: -1,
  56.   
  57.   _trans: false,
  58.   _doTransaction: function(callback, args) {
  59.     if (!ns.getPref("placesPrefs")) return;
  60.     
  61.     if (this._trans) return;
  62.     var t = Date.now();
  63.     var ret = false;
  64.     try { 
  65.       this._trans = true;
  66.       this.bmsvc.runInBatchMode({ runBatched: function(pp) { ret = callback.apply(pp.wrappedJSObject, args); } }, this);
  67.     } catch(e) {
  68.       this.dump("Transaction failed: " + e);
  69.     } finally {
  70.       this._trans = false;
  71.       if (ret) this.dump("Transaction done in " + (Date.now() - t) + "ms");
  72.     }
  73.   },
  74.   
  75.   sync: function(id, folderId, url) {
  76.     if (url && !/^(?:https:\/\/void\.noscript\.|data:[\s\S]*%7B[\s\S]*%7D)/.test(url)) return;
  77.     this._doTransaction(this._syncInternal, [id, folderId, url]);
  78.   },
  79.  
  80.   _syncInternal: function(id, folderId, url) {
  81.     var svc = this.bmsvc;
  82.     try {
  83.       var name = svc.getItemTitle(id);
  84.       if (name != this.NAME && name != this.LEGACY_NAME) return false;
  85.       if (!folderId) folderId = svc.getFolderIdForItem(id);
  86.       name = svc.getItemTitle(folderId);
  87.       if (name != this.NAME && name != this.LEGACY_NAME) return false;
  88.       
  89.       if (id != this._lastId) {
  90.         if (this._lastId > -1) svc.removeItem(this._lastId);
  91.         if (name == this.NAME) this._lastId = id;
  92.       }
  93.       
  94.       if (folderId != this._lastFolderId) {
  95.         if (this._lastFolderId > -1) svc.removeFolder(this._lastFolderId);
  96.         if (name == this.NAME) this._lastFolderId = this.id;
  97.       }
  98.  
  99.       legacy = true;
  100.       
  101.       var uri = (url || folderId) && svc.getBookmarkURI(id) || null;
  102.       if (uri && (uri instanceof CI.nsIURL) && uri.host == 'void.noscript.net') {
  103.         // legacy querystring + hash parsing, see 1.9.2
  104.         var qs = uri.query.replace(/^\?/, '').split("&");
  105.         var couple;
  106.         for each (var parm in qs) {
  107.           couple = parm.split("=");
  108.           ns.setPref(couple[0], decodeURIComponent(couple[1]));
  109.         }
  110.         ns.policyPB.setCharPref("sites", decodeURIComponent(uri.ref));
  111.         
  112.         
  113.       } else {
  114.         var data = null;
  115.         if (uri) {
  116.           var conf = decodeURIComponent(uri.path).match(/\{[\s\S]*\}/);
  117.           if (conf) data = { conf: conf && conf[0], ts: '' };
  118.         }
  119.         
  120.         data = data || this.getData(id);
  121.         
  122.         if (!(data && data.conf)) return false;
  123.         
  124.         if (data.ts) legacy = false;
  125.         
  126.         this._load(data);
  127.  
  128.       }
  129.       
  130.       if (legacy) this._trans = false; // force conversion
  131.       
  132.       ns.savePrefs();
  133.       
  134.       this.dump("Retrieve");
  135.       return true;
  136.     
  137.     } catch(e) {
  138.       this.dump("Retrieve error: " + e);
  139.     }
  140.     return false;
  141.   },
  142.   
  143.   _load: function(data) {
  144.     if (data.ts) ns.setPref("placesPrefs.ts", data.ts);
  145.     return ns.restoreConf(data.conf);
  146.   },
  147.   
  148.   save: function() {
  149.     this._doTransaction(this._saveInternal, []);
  150.   },
  151.  
  152.   _saveInternal: function() {
  153.     var id = -1;
  154.     var svc = this.bmsvc;
  155.     try {
  156.  
  157.       var oldData;
  158.       
  159.       if (this._lastId > -1) try {
  160.         oldData = this.getData(this._lastId);
  161.         if (oldData) id = this._lastId;
  162.       } catch (missingBookmark) {}
  163.       
  164.       if (id < 1) {
  165.         var parentId = svc.bookmarksMenuFolder;
  166.         var folderId = svc.getChildFolder(parentId, this.NAME);
  167.         
  168.         if (folderId < 1) {
  169.           try {
  170.             svc.removeFolder(svc.getChildFolder(parentId, this.LEGACY_NAME));
  171.           } catch(missingLegacy) {}
  172.           folderId = svc.createFolder(parentId, this.NAME, -1);
  173.         }
  174.         
  175.         this._lastFolderId = folderId;
  176.         try {
  177.           id = svc.getIdForItemAt(folderId, 0);
  178.         } catch(e) {
  179.           id = -1;
  180.         }
  181.       }
  182.       
  183.       if (id > -1) {
  184.         oldData = oldData || this.getData(id);
  185.         if (oldData && oldData.ts != ns.getPref("placesPrefs.ts")) {
  186.           var date = new Date();
  187.           date.setTime(oldData.ts.substring(1));
  188.           if (CC["@mozilla.org/embedcomp/prompt-service;1"
  189.             ].getService(CI.nsIPromptService).confirm(DOM.mostRecentBrowserWindow,
  190.               ns.getString("bookmarkSync.title"), ns.getString("bookmarkSync.confirm", [date.toLocaleString()]))
  191.           ) {
  192.             this._load(oldData);
  193.             ns.savePrefs();
  194.             return false;
  195.           }
  196.         }
  197.       }
  198.       
  199.       
  200.       var conf = ns.serializeConf();
  201.       
  202.       var uri = this.uri;
  203.       
  204.       if (id > -1) {
  205.         if (oldData && oldData.conf == conf) return true;
  206.         var oldURI = svc.getBookmarkURI(id);
  207.         if (!uri.equals(oldURI)) svc.changeBookmarkURI(id, uri);
  208.       } else {
  209.         id = svc.insertBookmark(folderId, uri, 0, this.NAME);
  210.       }
  211.       
  212.       this.setData(id, { ts: '#' + Date.now(), conf: conf });
  213.       
  214.       
  215.       this._lastId = id;
  216.       
  217.       this.dump("Persist");
  218.       return true;
  219.     
  220.     } catch(e) {
  221.       this.dump("Persist error: " + e);
  222.     }
  223.     return true;
  224.   },
  225.   
  226.   _getRawData: function(id) {
  227.     try {
  228.       return this.annsvc.getItemAnnotation(id, this.PROP);
  229.     } catch(e) {
  230.       return null;
  231.     }
  232.   },
  233.   _setRawData: function(id, value) {    
  234.     this.annsvc.setItemAnnotation(id, this.PROP, value, 0, this.annsvc.EXPIRE_NEVER);
  235.     this.bmsvc.setItemLastModified(id, (new Date()).getTime() * 1000);
  236.   },
  237.   
  238.   getData: function(id) {
  239.     var raw = this._getRawData(id);
  240.     var match = raw && raw.match(/^NoScript_Conf(#\d+)#(\{[\s\S]+\})/);
  241.     return match && { ts: match[1], conf: match[2] };
  242.   },
  243.   
  244.   setData: function(id, value) {
  245.     this._setRawData(id, "NoScript_Conf" + value.ts + "#" + value.conf);
  246.     ns.setPref("placesPrefs.ts", value.ts);
  247.   }
  248.  
  249. }